#include "cpu/exec/template-start.h"

// 定义指令名称为cmp
#define instr cmp

static void do_execute(){
    // 执行CMP指令，获取操作数差值，并更新EFLAGS寄存器
    DATA_TYPE result = op_dest->val - op_src->val;
    update_eflags_pf_zf_sf((DATA_TYPE_S)result);
    cpu.eflags.CF = result > op_dest->val;
    cpu.eflags.OF = MSB((op_dest->val ^ op_src->val) & (op_dest->val ^result));
    print_asm_template2(); // 输出指令汇编码
}

#if DATA_BYTE == 2 || DATA_BYTE == 4
// 如果数据字节长度为2或4，则将CMP指令操作数为立即数（16位）转换为操作数为内存的模板函数添加到指令解码中
make_instr_helper(si2rm)
#endif

// 将CMP指令操作数为立即数（8位）转换为操作数为累加器的模板函数添加到指令解码中
make_instr_helper(i2a)

// 将CMP指令操作数为立即数（8/16/32位）转换为操作数为内存的模板函数添加到指令解码中
make_instr_helper(i2rm)

// 将CMP指令操作数为寄存器的模板函数添加到指令解码中
make_instr_helper(r2rm)

// 将CMP指令操作数为内存的模板函数添加到指令解码中
make_instr_helper(rm2r)

#include "cpu/exec/template-end.h"
